﻿-- Function: fun_borrador_ins(character, character, character, character, character varying, character varying, character, character varying, character, character varying)

-- DROP FUNCTION fun_borrador_ins(character, character, character, character, character varying, character varying, character, character varying, character, character varying);

CREATE OR REPLACE FUNCTION fun_borrador_ins(IN ptipo_docu character, IN pquienharadocumento character, IN pmensajeparaquienharadocumento character, IN pdestinatario character, IN pasunto character varying, IN pcuerpo character varying, IN preferencia character, IN pcopia character varying, IN pusuario character, IN pquienfirma character varying, OUT ban character varying)
  RETURNS character varying AS
$BODY$
   DECLARE      
      v_firma_dni character(8);
      v_firma_nombres character varying;
      v_firma_cargo character varying;
      v_firma_codigo_directiva character varying;      
      v_codigo_borrador CHARACTER(3);	

      --- ° ---
      respuesta character varying;
         
      longitud integer;
      v_anhio character(4);
      v_anhio_docu_temp character varying;
      v_cabecera character varying;
      v_cabecera_borrador character varying;
      v_cabecera_docu_temp character varying;
      v_contador integer;
      v_dni_codigo character varying;
      
      v_numero_docu integer;      
      v_nombre_anhio character varying;
      v_numero_docu_temp integer;
      v_profesion character varying;
      v_quien character varying;
      v_quedice_quien character varying;
      v_tipo_docu_temp character(3);     
      v_cabecera_complemento character varying;
      
      v_codigo_area character varying;
      v_nombre_area character varying;
      v_codigo_directiva character varying;
      
      v_correos_copia character varying;
      
      v_usuario_codigo character(8);
      v_usuario_nombres character varying;
      v_usuario_cargo character varying;
      v_usuario_area character(8);
      v_usuario_codigo_area character(4);
      v_usuario_codigo_directiva character(4);
      
   BEGIN
      ban := 'ok';
      v_codigo_borrador = '998'	;
      --- obtenemos lo referente a quien firma 
      v_firma_dni  = substring(pquienfirma,1,position('|' in pquienfirma)-1);   
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_nombres = substring(pquienfirma,1,position('|' in pquienfirma)-1);  
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_cargo = substring(pquienfirma,1,position('|' in pquienfirma)-1);          
      pquienfirma = substring(pquienfirma,position('|' in pquienfirma)+1,char_length(pquienfirma));
      v_firma_codigo_directiva = substring(pquienfirma,1,position('|' in pquienfirma)-1);    
      
      --- obtenemos los datos del usuario que genero el documento
      v_usuario_codigo = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_nombres = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_cargo = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_area = trim(substring(pusuario,1,position('|' in pusuario)-1));
      pusuario = substring(pusuario,position('|' in pusuario)+1,char_length(pusuario));
      v_usuario_codigo_directiva = trim(substring(pusuario,1,position('|' in pusuario)-1));      
      v_usuario_codigo_area = v_usuario_area;
      
      --- Extraemos el Anio en que estamos
      v_anhio = (SELECT extract(year from now())::text as year);
      --- Verificamos y es que ya existe algun borrador en este anhio
      longitud = (select count(*) from tb_parametros where trim(nombre_para) = v_codigo_borrador||v_anhio);
      if longitud = 0 THEN
         --- No hay, entonces insertamos el correlativo de borrador para este anio
         insert into tb_parametros(nombre_para,valor_para) values(v_codigo_borrador||v_anhio,1);
	 v_numero_docu = 1;
      else
	 --- Si hay, entonces traemos el ultimo correlativo y autoincrementamos el correlativo de borrador
	 respuesta = (select valor_para from tb_parametros where trim(nombre_para) = v_codigo_borrador||v_anhio);	 
	 v_numero_docu = (select to_number (respuesta,'9999999999')+1);
	 update tb_parametros set valor_para = trim(to_char(v_numero_docu,'9999999999')) where trim(nombre_para) = v_codigo_borrador||v_anhio;
      end if;  
      
      --- traemos el nombre del anhio actual
      v_nombre_anhio = (select nombre_nomb_anhi from tb_nombre_anhio where anhio_nomb_anhi = v_anhio);
      
	IF TRIM(v_usuario_codigo) <> TRIM(v_usuario_area) THEN
		v_cabecera_complemento = TRIM(v_usuario_codigo)||'.'||TRIM(v_firma_codigo_directiva)||'.';
	ELSE
		v_cabecera_complemento = TRIM(v_firma_codigo_directiva)||'.';
         END IF;
	 
	 v_cabecera = (select descripcion_docu_tipo from tb_documento_tipo where codigo_docu_tipo = ptipo_docu);
	 v_cabecera_borrador = (select descripcion_docu_tipo from tb_documento_tipo where codigo_docu_tipo = v_codigo_borrador);
	 
	 --- Construimos nombre de cabecera
	 v_cabecera = trim(v_cabecera)||' N°  -'||v_anhio||'-EPS GRAU S.A./'||v_cabecera_complemento||' ('||TRIM(v_cabecera_borrador)||')'; 
	       
      --- agregamos los correos de copia
      if not( ptipo_docu = '999') then 
         v_correos_copia = '';
         WHILE 1 < char_length(pcopia) LOOP            
            v_codigo_area = trim(substring(pcopia,1,position('|' in pcopia)-1));
	    pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	    v_nombre_area = trim(substring(pcopia,1,position('|' in pcopia)-1));
	    pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	    v_codigo_directiva = trim(substring(pcopia,1,position('|' in pcopia)-1));
	    pcopia = substring(pcopia,position('|' in pcopia)+1,char_length(pcopia));
	    v_correos_copia = v_correos_copia||trim(v_codigo_directiva)||',';
	 
	    INSERT INTO tb_documento_copia(tipo_documento_docu_copi, numero_documento_docu_copi, anhio_documento_docu_copi, 
	    codigo_dni_docu_copi, nombres_docu_copi, correo_docu_copi)  VALUES (v_codigo_borrador, v_numero_docu,v_anhio,trim( v_codigo_area) 
	    ,trim(v_nombre_area), trim(v_codigo_directiva));
         end loop;
      end if;   
      --- agregamos el docuemnto en si 
            INSERT INTO tb_documento(tipo_docu,asunto_docu,cuerpo_docu,numero_docu,cabecera_docu,fecha_generacion_docu,anhio_docu,
		nombre_anhio_docu,copia_docu,firma_dni_docu,firma_nombres_docu,firma_cargo_docu,
		fecha_cierre_docu,usuario_codigo_docu,hora_generacion_docu,generar_flash_docu,
		firma_codigo_directiva,usuario_crea_documento_docu,usuario_cod_area_crea_documento_docu,tip_doc_borr_docu,
		tip_doc_borr_message_docu,codigo_empresa_docu,estado_documento_docu) 
            VALUES(v_codigo_borrador,upper(pasunto),pcuerpo,v_numero_docu,trim(v_cabecera),now(),v_anhio,
		v_nombre_anhio,TRIM(v_correos_copia),v_firma_dni,TRIM(v_firma_nombres),TRIM(v_firma_cargo),
		CURRENT_DATE,v_usuario_codigo,CURRENT_TIME,1,
		v_firma_codigo_directiva,v_usuario_codigo,v_usuario_codigo_area,ptipo_docu,pmensajeparaquienharadocumento,'','');

      --- PARA BANDEJA DE QUIEN ELABORARA EL DOCUMENTO
            v_dni_codigo = substring(pquienharadocumento,1,position('|' in pquienharadocumento)-1);
            pquienharadocumento = substring(pquienharadocumento,position('|' in pquienharadocumento)+1,char_length(pquienharadocumento));
            v_profesion = substring(pquienharadocumento,1,position('|' in pquienharadocumento)-1);
            pquienharadocumento = substring(pquienharadocumento,position('|' in pquienharadocumento)+1,char_length(pquienharadocumento));
            v_quien = substring(pquienharadocumento,1,position('|' in pquienharadocumento)-1);
            pquienharadocumento = substring(pquienharadocumento,position('|' in pquienharadocumento)+1,char_length(pquienharadocumento));
            v_quedice_quien = substring(pquienharadocumento,1,position('|' in pquienharadocumento)-1);
            pquienharadocumento = substring(pquienharadocumento,position('|' in pquienharadocumento)+1,char_length(pquienharadocumento));                   
            
	    insert into tb_bandeja_usuario(dni_unidad_band_usua,codigo_motivo_band_usua,remitente_dni_unidad_band_usua,
		remitente_nombres_band_usua,remitente_cargo_band_usua,fecha_band_usua,hora_band_usua,estado_band_usua,observacion_band_usua,
		tipo_documento_band_usua,numero_documento_band_usua,anhio_documento_band_usua,nombre_unidad_band_usua)            
	    values(v_dni_codigo,'025',trim(v_usuario_codigo),trim(v_usuario_nombres),trim(v_usuario_cargo),current_date,
		current_time,'B',pmensajeparaquienharadocumento,v_codigo_borrador,v_numero_docu,v_anhio,v_profesion||' '||v_quien);

	--- PARA BANDEJA DE QUIEN ELABORA EL BORRADOR
	    insert into tb_bandeja_usuario(dni_unidad_band_usua,codigo_motivo_band_usua,remitente_dni_unidad_band_usua,
		remitente_nombres_band_usua,remitente_cargo_band_usua,fecha_band_usua,hora_band_usua,estado_band_usua,observacion_band_usua,
		tipo_documento_band_usua,numero_documento_band_usua,anhio_documento_band_usua,nombre_unidad_band_usua)            
	    values(v_usuario_codigo,'025',trim(v_usuario_codigo),trim(v_usuario_nombres),trim(v_usuario_cargo),current_date,
		current_time,'A',pmensajeparaquienharadocumento,v_codigo_borrador,v_numero_docu,v_anhio,v_usuario_nombres);

	IF ptipo_docu = '002' OR ptipo_docu = '008' OR ptipo_docu = '009' OR ptipo_docu = '011' then 
      --- Agregamos los destinatarios
		WHILE 1 < char_length(pdestinatario) LOOP
		    v_dni_codigo = substring(pdestinatario,1,position('|' in pdestinatario)-1);
		    pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
		    v_profesion = substring(pdestinatario,1,position('|' in pdestinatario)-1);
		    pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
		    v_quien = substring(pdestinatario,1,position('|' in pdestinatario)-1);
		    pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));
		    v_quedice_quien = substring(pdestinatario,1,position('|' in pdestinatario)-1);
		    pdestinatario = substring(pdestinatario,position('|' in pdestinatario)+1,char_length(pdestinatario));                   
		    
		    insert into tb_documento_destinatario(tipo_documento_docu_dest,numero_documento_docu_dest,anhio_documento_docu_dest,
		    profesion_docu_dest,
		    aquien_docu_dest,datos_aquien_docu_dest,codigo_dni_docu_dest) 
		    values(v_codigo_borrador,v_numero_docu,v_anhio,UPPER(v_profesion),UPPER(v_quien),UPPER(v_quedice_quien),v_dni_codigo);
		  END LOOP;   
        END IF;
		
          
      --- agregamos las referencias 
      longitud = 0;
      WHILE 1 < char_length(preferencia) LOOP    
         longitud = longitud +1;
         v_tipo_docu_temp = substring(preferencia,1,position('|' in preferencia)-1);
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));         
         v_numero_docu_temp = to_number ( substring(preferencia,1,position('|' in preferencia)-1),'9999999');
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));
         v_anhio_docu_temp = TRIM(substring(preferencia,1,position('|' in preferencia)-1));
         preferencia = substring(preferencia,position('|' in preferencia)+1,char_length(preferencia));

	 IF v_tipo_docu_temp = '998' AND v_numero_docu_temp=0 THEN

		-- En este caso el Nombre de la referencia se almacena en la variable 'v_anhio_docu_temp' Debido a que es un documento
		-- que no esta en el sistema
		---
		INSERT INTO tb_documento_referencia(tipo_documento_docu_refe,numero_documento_docu_refe,anhio_documento_docu_refe,
		tipo_documento_referencia_docu_refe,numero_documento_referencia_docu_refe,cabecera_documento_referencia_docu_refe,
		anhio_documento_referencia_docu_refe) 
		VALUES(v_codigo_borrador,v_numero_docu,v_anhio,v_tipo_docu_temp,longitud,
			v_anhio_docu_temp,CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS CHARACTER VARYING));   
		---
	 ELSE
		
		v_cabecera_docu_temp = TRIM((SELECT cabecera_docu FROM tb_documento 
						WHERE tipo_docu=v_tipo_docu_temp 
						AND numero_docu=v_numero_docu_temp 
						AND anhio_docu=v_anhio_docu_temp));
		v_cabecera_docu_temp = TRIM(v_cabecera_docu_temp);		
		---
		INSERT INTO tb_documento_referencia(tipo_documento_docu_refe,numero_documento_docu_refe,anhio_documento_docu_refe,
		tipo_documento_referencia_docu_refe,numero_documento_referencia_docu_refe,cabecera_documento_referencia_docu_refe,
		anhio_documento_referencia_docu_refe) 
		VALUES(v_codigo_borrador,v_numero_docu,v_anhio,v_tipo_docu_temp,v_numero_docu_temp,v_cabecera_docu_temp,v_anhio_docu_temp);   
		---
	 END IF;	
         
      END LOOP;
      
      ban := '1'||v_codigo_borrador||'-'||trim(to_char(v_numero_docu,'9999999999'))||'-'||v_anhio;
      
      EXCEPTION
      WHEN foreign_key_violation THEN
		RAISE EXCEPTION 'error al actualizar el metrado';
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fun_borrador_ins(character, character, character, character, character varying, character varying, character, character varying, character, character varying) OWNER TO postgres;
